﻿using Microsoft.Win32;
using MySql.Data.MySqlClient;

namespace Mod管家.Util
{
    /// <summary>
    ///     提供数据库操作的静态辅助方法。
    /// </summary>
    public static class DatabaseHelper
    {
        private static string? _connectionString; // 数据库连接字符串
        private static MySqlConnection? _connection; // 数据库连接对象

        /// <summary>
        ///     设置数据库连接字符串。
        /// </summary>
        /// <param name="server">数据库服务器地址。</param>
        /// <param name="database">数据库名称。</param>
        /// <param name="username">数据库用户名。</param>
        /// <param name="password">数据库用户密码。</param>
        /// <param name="port">数据库服务端口。</param>
        public static void SetConnectionString(string server, string database, string username, string password,
            int port)
        {
            _connectionString = $"Server={server};Port={port};Database={database};Uid={username};Pwd={password};";
        }

        /// <summary>
        ///     连接到数据库。
        /// </summary>
        public static void ConnectToDatabase()
        {
            _connection = new MySqlConnection(_connectionString);
            try
            {
                _connection.Open(); // 尝试打开数据库连接
                Console.WriteLine("Database connection successful!");
            }
            catch (Exception ex)
            {
                // 异常处理：显示错误信息并退出应用程序
                MessageBox.Show($"软件初始化错误！错误信息: {ex.Message}", "Mod管家", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
        }

        /// <summary>
        ///     获取模组信息。
        /// </summary>
        /// <param name="cmd">SQL命令字符串。</param>
        /// <returns>MySqlDataReader对象，用于读取查询结果。</returns>
        private static MySqlDataReader GetModInfo(string cmd)
        {
            var command = new MySqlCommand(cmd, _connection);
            var reader = command.ExecuteReader();
            return reader;
        }

        /// <summary>
        ///     更新模组的未锁定状态。
        /// </summary>
        /// <param name="unKey">模组的解锁码。</param>
        private static void UpdateModUnKeyStatus(string unKey)
        {
            var command =
                new MySqlCommand($"UPDATE mod_list SET unlock_code_status = '1' WHERE mod_unlock_code = '{unKey}'",
                    _connection);
            command.ExecuteNonQuery();
        }

        /// <summary>
        ///     获取模组的解锁状态，并进行相关注册表操作。
        /// </summary>
        /// <param name="unKey">模组的解锁码。</param>
        /// <param name="modName">模组的名称。</param>
        /// <returns>
        ///     返回操作的状态码：
        ///     -1：查询无结果。
        ///     -2：模组已锁定。
        ///     1：操作成功。
        /// </returns>
        public static int GetModUnKeyStatus(string unKey, string modName)
        {
            // 使用提供的解锁码和模组名查询模组信息
            var reader =
                GetModInfo($"SELECT * FROM mod_list WHERE mod_unlock_code = '{unKey}' and mod_name = '{modName}'");
            if (!reader.Read()) return -1; // 如果查询无结果，返回-1

            // 将查询结果存入数组
            string[] resultArray = new string[reader.FieldCount];
            for (int i = 0; i < reader.FieldCount; i++)
            {
                resultArray[i] = reader.GetString(i);
            }

            // 如果模组已被锁定，返回-2
            if (resultArray[4] == "1")
            {
                return -2;
            }

            // 在注册表中写入模组相关信息
            var key = Registry.LocalMachine.CreateSubKey($@"SOFTWARE\BH6MOD\Mod管家\AppData\modKey\{unKey}");
            key.SetValue("modName", resultArray[1]);
            key.SetValue("modUnZipPassword", resultArray[3]);
            key.Close(); // 关闭注册表子键

            // 在注册表的另一个位置记录模组键
            key = Registry.LocalMachine.CreateSubKey($@"SOFTWARE\BH6MOD\Mod管家\AppData\modList\{modName}");
            key.SetValue("modKey", unKey);
            key.Close(); // 关闭注册表子键

            // 更新模组的解锁状态
            UpdateModUnKeyStatus(unKey);
            return 1; // 操作成功，返回1
        }
    }
}